package com.atde._03_creational_design_patterns.singleton.type07;


/**
 * @BelongsProject: hsp_java_design_mode
 * @BelongsPackage: com.atde._03_creational_design_patterns.singleton.type07
 * @Author: Del
 * @CreateTime: 2025-05-31  16:42
 * @Description: 单例模式  -- 懒汉式（静态内部类）
 * @Version: 1.0
 */
public class SingletonTest07 {
    public static void main(String[] args) {
        Singleton instance01 = Singleton.getInstance();
        Singleton instance02 = Singleton.getInstance();
        System.out.println(instance01 == instance02);
        System.out.println("instance01.hashCode = " +instance01.hashCode());
        System.out.println("instance02.hashCode = " +instance02.hashCode());
    }
}

/**
 * 懒汉式（静态内部类）
 * 1）这种方式采用了类装载的机制来保证初始化实例时只有一个线程
 * 2）静态内部类方式在Singleton类被装载时并不会立即实例化，而是在需要实例化时
 * 调用 getInstance 方法，才会装载SingletonInstance类，从而完成Singleton的实例化
 * 3）类的静态属性只会在第一次加载类的时候初始化，所以在这里，JVM 帮助我们保证了线程的安全性，在类进行初始化时
 * 别的线程是无法进入的
 * 4）优点：避免了线程不安全，利用静态内部类特点实现延迟加载，效率高
 * 5）结论：推荐使用
 */
class Singleton {
    // 1. 构造器私有化
    private Singleton() {}

    // 2. 静态内部类，该类中有一个静态属性 Singleton
    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

     // 3. 提供一个静态的公有方法，直接返回 SingletonInstance.INSTANCE
    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}
